<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.12"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Os1: ORB-SLAM2 comentado y modificado, fork personal os1</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Os1
   &#160;<span id="projectnumber">1</span>
   </div>
   <div id="projectbrief">OrbSlam2 documentado y modificado</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.12 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,'Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('index.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">ORB-SLAM2 comentado y modificado, fork personal os1 </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="intro_sec"></a>
Introducción a ORB-SLAM2</h1>
<p>ORB-SLAM2 es la versión 2 de ORB-SLAM, publicada al año siguiente del original por los mismos autores. Se trata de una prueba de concepto, una aplicación que demuestra el funcionamiento de ORB-SLAM. La aplicación tiene una interfaz de usuario mínima y opcional. ORB-SLAM2 está pensado para ser usado como parte de un proyecto mayor, conectado por ROS.</p>
<h1><a class="anchor" id="conf"></a>
Configuración para el primer uso</h1>
<p>Para poder compilar este código con Eclipse CDT, se requiere tener instalado OpenCV 2.4.3 o superior, incluyendo 3.1, Pangolin, Blas, Lapack, Eigen3. Consultar <a href="https://github.com/raulmur/ORB_SLAM2">https://github.com/raulmur/ORB_SLAM2</a> 2.Prerequisites. En Eclipse se deben cargar estas librerías (Properties for os1, Settings, g++ Linker Libraries):</p>
<ul>
<li>opencv_core, usada para Mat</li>
<li>pangolin, para la visualización del mapa</li>
<li>opencv_features2d, para FAST</li>
<li>opencv_highgui, para visualizar el cuadro de la cámara</li>
<li>pthread, para disparar hilos</li>
<li>opencv_videoio, para obtener imágenes de la webcam o de archivo</li>
<li>opencv_imgcodecs, para obtener imágenes de archivo de video</li>
<li>opencv_imgproc</li>
<li>opencv_calib3d</li>
<li>GL</li>
<li>GLU</li>
</ul>
<p>Carpeta de Eigen en Properties for os1, c/c++ General Settings, Path and Symbols, Includes: /usr/local/include/eigen3</p>
<p>Carpeta de Eigen en Properties for os1, c/c++ General Settings, Path and Symbols, Symbols, G++:</p><ul>
<li>_cplusplus 201103L</li>
<li>ArchivoBowBinario</li>
<li>COMPILEDWITHC11</li>
</ul>
<h1><a class="anchor" id="desc"></a>
Secuencia inicial del algoritmo ORB-SLAM2</h1>
<p>Como es habitual, la ejecución inicia por main, que:</p><ul>
<li>lee los parámetros de la línea de comando de ejecución</li>
<li>crea el objeto SLAM, única instancia de la clase System, cuyo constructor<ul>
<li>carga el vocabulario BoW</li>
<li>carga el archivo de configuración y lo parsea</li>
<li>crea hilos para los cuatro procesos principales y paralelos:<ul>
<li>LoopClosing</li>
<li>LocalMapping</li>
<li>Viewer</li>
<li>Tracking (que se ejecuta en el hilo de main).</li>
</ul>
</li>
</ul>
</li>
<li><p class="startli">entra en el bucle principal while(true) que ejecutará el proceso entero por cada cuadro de la cámara</p>
<p class="startli">Este bucle principal es un algoritmo largo, separado en métodos por prolijidad, la mayoría de los cuales se invocan desde un único lugar. La secuencia de invocaciones es: 1- System::TrackMonocular, pasando la imagen a color de la cámara 2- Tracking::GrabImageMonocular, pasando la imagen Mat en escala de grises, crea el currentFrame a partir de la imagen 3- Tracking::Track, autómata finito que despacha métodos de acuerdo al estado. 4- Tracking::TrackWithMotionModel, invocado en el estado OK</p>
</li>
</ul>
<h1><a class="anchor" id="clas"></a>
Clasificación de las clases</h1>
<p>ORB-SLAM2 tiene un archivo .h y otro .cc para cada clase, todas declaradas en el espacio de nombres ORB-SLAM2. Adopta los siguientes sufijos para nombrar las propiedades miembros de clases, explicitando su tipo:</p><ul>
<li>m: miembro. Todas las propiedades comienzan con m.</li>
<li>p: puntero</li>
<li>v: vector</li>
<li>b: booleano</li>
<li>n: entero</li>
<li>f: float Hay excepciones, probablemente por error.</li>
</ul>
<p>Ejemplos:</p><ul>
<li>mvpMapPoints es un miembro vector de punteros.</li>
<li>mnId es un miembro entero Id.</li>
</ul>
<p>Hay varios tipos de clase:</p><ul>
<li>Clases que se instancian repetidas veces:<ul>
<li>Frame</li>
<li>KeyFrame</li>
<li>MapPoint</li>
<li>Initializer</li>
<li>ORBextractor</li>
<li>ORBmatcher</li>
</ul>
</li>
<li>Clases que se instancian una única vez y se asocian a un thread:<ul>
<li>Tracking</li>
<li>LocalMapping</li>
<li>Viewer</li>
<li>LoopClosing</li>
</ul>
</li>
<li>Clases que se instancian una única vez y perduran:<ul>
<li>System</li>
<li>Map</li>
<li>KeyFrameDatabase</li>
<li>MapDrawer</li>
<li>FrameDrawer</li>
</ul>
</li>
<li>Clases que no se instancian, no tienen propiedades, son repositorios de métodos de clase:<ul>
<li>Converter</li>
<li>Optimizer</li>
</ul>
</li>
</ul>
<p>Excepciones: <a class="el" href="_o_r_b_vocabulary_8h.html">ORBVocabulary.h</a> es una excepción a esta regla, no define una clase sino un simple typedef. <a class="el" href="_o_r_bextractor_8h.html">ORBExtractor.h</a> define dos clases, incluyendo ExtractorNode. La carpeta Thirparty contiene versiones podadas de <a class="el" href="namespace_d_bo_w2.html" title="File: BowVector.cpp Date: March 2011 Author: Dorian Galvez-Lopez Description: bag of words vector Lic...">DBoW2</a> y <a class="el" href="namespaceg2o.html">g2o</a> con estilos propios.</p>
<h1><a class="anchor" id="conc"></a>
Conceptos de ORB-SLAM y sus clases</h1>
<p>Frame: A partir de cada imagen de la cámara se crea un objeto Frame efímero. Usualmente perduran el cuadro actual y el anterior solamente, habiendo sólo dos instancias de esta clase simultáneamente en el sistema. El objeto Frame tiene los puntos singulares detectados, su versión antidistorsionada, sus descriptores y los puntos del mapa asociados. La clase proporciona los métodos para su construcción a partir de la imagen.</p>
<p>KeyFrame: Los KeyFrame se crean a partir de un Frame cuando el sistema entiende que éste aporta información al mapa. Mientras un Frame es efímero, un KeyFrame es de larga vida, es la manera en que un Frame se convierte en parte del mapa. Cuando se crea un KeyFrame, copia la información principal del Frame actual, y computa más datos, como por ejemplo los BoW de cada descriptor. La documentación de KeyFrame explica la notación de matrices utilizadas en ésta y otras clases.</p>
<p>MapPoint: Punto 3D del mapa del mundo. No sólo tiene las coordenadas del punto, sino también la lista de KeyFrames que lo observan, la lista de descriptores asociados al punto (un descriptor por cada KeyFrame que lo observa), entre otros.</p>
<p>Map: Mapa del mundo. Tiene una lista de MapPoitns, una lista de KeyFrames, y métodos para la administración del mapa.</p>
<h1><a class="anchor" id="hilos"></a>
Descripción de los hilos</h1>
<p>ORB-SLAM tiene cuatro hilos paralelos, cada uno con su propio bucle.</p>
<ul>
<li>Tracking es el objeto preponderante del hilo principal, que se encarga de procesar cada imagen que llega, detectando puntos singulares, calculando descriptores, macheando con el cuadro anterior tratando de identificar los puntos conocidos del mapa. Decide cuándo agregar un nuevo Keyframe. No agrega nuevos puntos al mapa.</li>
<li>LocalMapping procura agregar puntos al mapa cada vez que se agrega un KeyFrame. Agrega puntos por triangulación con KeyFrames vecinos. También optimiza el mapa quitando keyframes redundantes.</li>
<li>LoopClosing se aboca a comparar la observación actual con el mapa, procurando alguna pose que explique la observación actual, detectando así bucles. En ese caso procede con el cierre del bucle. -Viewer maneja las dos visualizaciones: la del mapa y la de la imagen procesada. </li>
</ul>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.12 </li>
  </ul>
</div>
</body>
</html>
